<?php

class Application_Model_Usuario extends Zend_Db_Table_Abstract {

    protected $_name = 'pessoa';
    protected $_primary = 'codigo';
    protected $_sequence = 'seq_pessoa';
    protected $_schema = 'sistema';
    
    private static $instance;

    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new Application_Model_Usuario();
            return self::$instance;
        }
        return self::$instance;
    }

    public function insert($data) {
       
        if (isset($data['nome']) && isset($data['dt_cadastro']) && isset($data['cep']) && isset($data['dt_nascimento']) && isset($data['endereco'])
                && isset($data['cidade']) && isset($data['tipo_pessoa'])){
            $codigo = parent::insert($this->getPessoa($data));
            $data['codigo'] = $codigo;
            
            if($data['tipo_pessoa'] == 2){
                Application_Model_Funcionario::getInstance()->insere($this->getFuncionario($data));
            }
            
            if(isset($data['plano_saude']) && count($data['plano_saude']) > 0 && isset($codigo)){
                Application_Model_PlanoSaudeUsuario::getInstance()->insere($data, $codigo);
            }
        }else{
            new Exception("Erro ao inserir usuarios");
        }
        
    }

    public function update(array $data, $where = '') {
        $where = 'codigo = ' . $data['codigo'];
        parent::update($this->getPessoa($data), $where);
        
        $func = Application_Model_Funcionario::getInstance()->getByid($data['codigo']);
        if($data['tipo_pessoa'] == 2){
            if(isset($func) && !is_null($func)){
                Application_Model_Funcionario::getInstance()->update($this->getFuncionario($data));
            }else{
                Application_Model_Funcionario::getInstance()->insere($this->getFuncionario($data));
            }
        }else{
            if(isset($func) && !is_null($func)){
                Application_Model_Funcionario::getInstance()->remove($data['codigo']);
            }
        }
        
        if(isset($data["plano_saude"])){
            Application_Model_PlanoSaudeUsuario::getInstance()->update($data["plano_saude"],$data["codigo"]);
        }
    }

    public function getById($id) {
        return $this->fetchRow("codigo = " . $id ." and dt_exclusao is null");
    }
    
    public function getByIdCompleto($id) {
        $user = $this->getById($id)->toArray();
        
        if(isset($user['codigo']) && isset($user['tipo_pessoa']) == 2){
            $funcionario = Application_Model_Funcionario::getInstance()->getById($id);
            if(isset($funcionario['codigo'])){
                $user = $this->makeMergeFunc($user,$funcionario);
            }
        }
        
        $planos = Application_Model_PlanoSaudeUsuario::getInstance()->getByPessoa($user['codigo']);
        if(count($planos) > 0){
            $retorno;
            foreach ($planos as $value) {
                $retorno[] = $value['plano_saude'];
            }
            $user['plano_saude'] = $retorno;
        }else{
            $user['plano_saude'] = array();
        }

        return $user;
    }

    public function getByCPF($cpf) {
        return $this->fetchRow("cpf = '" . $cpf ."' and dt_exclusao is null");
    }

    public function lista($page, $qntPagina, $orderName, $order, $name, $dtCadastro,$cidade,$username,$cpf, $tpPessoa) {
        $sql = 'select p.codigo,p.nome,p.cpf,p.cidade,tp.descricao,f.username,
                to_char(p.dt_nascimento , \'DD/MM/YYYY\') as dt_nascimento,p.dt_cadastro
                from '.$this->_schema.'.pessoa p
                left join '.$this->_schema.'.tipo_pessoa tp on tp.codigo = p.tipo_pessoa
                left join '.$this->_schema.'.funcionario f on f.codigo = p.codigo
                where p.dt_exclusao is null ';
       
        if(isset($username) && !empty($username)){
            $sql.=' and f.username like \''. $username. '%\'';
        }
       
        if(isset($cidade) && !empty($cidade)){
            $sql.=' and p.cidade like \''. $cidade. '%\'';
        }
       
        if(isset($tpPessoa) && !empty($tpPessoa)){
            $sql.=' and tp.codigo like \''. $tpPessoa. '%\'';
        }
       
        if(isset($cpf) && !empty($cpf)){
            $sql.=' and p.cpf = \''. $cpf. '\'';
        }
       
        if(isset($name) && !empty($name)){
            $sql.=' and p.nome like \''. $name. '%\'';
        }
        
        if(isset($dtCadastro) && !empty($dtCadastro)){
            $sql.=' and p.dt_cadastro = \''. Util_Function_Util::formataData($dtCadastro, 'Y/M/d'). '\'';
        }
        
        if (isset($orderName) && isset($order)) {
            $sql .= ' order by ' . $orderName . ' ' . $order;
        }

        $rs = $this->getAdapter()->query($sql)->fetchAll();
        
        $paginator = Zend_Paginator::factory($rs);
        $paginator->setCurrentPageNumber($page);
        $paginator->setItemCountPerPage($qntPagina);

        return $paginator;
    }

    public function remove($id){
        $user = $this->getById($id)->toArray();
        $where = ' codigo = ' .$id;
        $user['dt_exclusao'] = Zend_Date::now()->get('Y/M/d');
        parent::update($user, $where);
        
        //remove funcionario
        if(isset($user['tipo_pessoa']) && $user['tipo_pessoa'] == 2){
            Application_Model_Funcionario::getInstance()->remove($id);
        }
        
        //remove planos de saude da pessoa
        Application_Model_PlanoSaudeUsuario::getInstance()->removeByPessoa($id);
        
    }
 
    private function getPessoa($data){
        $pessoa['nome'] = $data['nome'];
        $pessoa['endereco'] = $data['endereco'];
        $pessoa['cidade'] = $data['cidade'];
        $pessoa['cep'] = $data['cep'];
        $pessoa['dt_nascimento'] = $data['dt_nascimento'];
        $pessoa['dt_cadastro'] = $data['dt_cadastro'];
        $pessoa['tipo_pessoa'] = $data['tipo_pessoa'];
        $pessoa['dt_exclusao'] = $data['dt_exclusao'];
        $pessoa['cpf'] = $data['cpf'];
        $pessoa['parceria'] = $data['parceria'];
        return $pessoa;
    }
    
    private function getFuncionario($data){
        $funcionario['dt_exclusao'] = $data['dt_exclusao'];
        $funcionario['salario'] = $data['salario'];
        $funcionario['dt_contratacao'] = $data['dt_contratacao'];
        $funcionario['password'] = $data['password'];
        $funcionario['username'] = $data['username'];
        $funcionario['codigo'] = $data['codigo'];
        $funcionario['perfil_acesso'] = $data['perfil_acesso'];
        return $funcionario;
    }
 
    private function makeMergeFunc($user, $func){
        $user['salario'] = $func['salario'];
        $user['dt_contratacao'] = $func['dt_contratacao'];
        $user['password'] = $func['password'];
        $user['username'] = $func['username'];
        $user['perfil_acesso'] = $func['perfil_acesso'];
        return $user;
    }
    
    public function getListFuncionario(){
        $sql = 'select codigo, nome from '.$this->_schema.'.pessoa where tipo_pessoa = 2 and dt_exclusao is null';
        return $this->getAdapter()->query($sql)->fetchAll();
    }

    public function getListCliente(){
        $sql = 'select codigo, nome from '.$this->_schema.'.pessoa where tipo_pessoa = 1 and dt_exclusao is null';
        return $this->getAdapter()->query($sql)->fetchAll();
    }

}